// 1.引入express
const express = require("express");
// 2.创建应用对象
const app = express();
// 3.创建路由规则
app.get("/server", (req, res) => {
  // 设置响应头  设置允许跨域
  res.setHeader("Access-Control-Allow-Origin", "*");
  // 设置响应体
  res.send("Hello Express");
});

// 设用全局中间件设置允许跨域
/* app.use((req, res, next) => {
  res.setHeader("Access-Control-Allow-Origin", "*");
  next();
}); */

// 创建POST请求的路由规则
app.post("/server", (req, res) => {
  // 设置接收任何的请求头信息
  res.setHeader("Access-Control-Allow-Header", "*");
  res.send("这是POST请求");
});

app.get("/json-server", (req, res) => {
  // 响应一个对象
  const data = {
    name: "yibuxaioxin",
  };
  // 将对象转换为字符串
  let str = JSON.stringify(data);
  res.send(str);
});

// 延时响应
app.all("/delay", (req, res) => {
  res.setHeader("Access-Control-Allow-Headers", "*");
  // 三秒后再将相应内容发送给客户端，默认请求超时
  setTimeout(() => {
    res.send("延时响应");
  }, 3000);
});

// JQuery服务
app.all("/jquery", (req, res) => {
  // 允许所有的头信息
  res.setHeader("Access-Control-Allow-Headers", "*");
  const data = {
    name: "yibuxaioxin",
  };
  // res.send("jquery 发送的AJAX请求")
  res.send(JSON.stringify(data)); // send()方法只能发送字符串
});

// axios
app.all("/axios", (req, res) => {
  res.setHeader("Access-Control-Allow-Headers", "*");
  res.send("axios 发送的AJAX请求");
});

// fetch
app.all("/fetch", (req, res) => {
  res.setHeader("Access-Control-Allow-Headers", "*");
  // res.send("fetch 发送的AJAX请求");
  res.send(JSON.stringify({ name: "yibuxaioxin" }));
});

// jsonp
app.all("/jsonp", (req, res) => {
  // res.send("console.log('hello')");
  const data = {
    name: "yibuxiaoxin",
  };
  // 将数据转化为字符串
  let str = JSON.stringify(data);
  // 返回 js 代码让浏览器执行
  res.end(`handle(${str})`);
});

// 用户名检测是否存在
app.all("/check-username", (req, res) => {
  const data = {
    exist: 1,
    msg: "用户名已存在",
  };
  // 将数据转化为字符串
  let str = JSON.stringify(data);
  // 返回结果
  res.end(`handle(${str})`);
});

app.all("/jquery-jsonp", (req, res) => {
  const data = {
    name: "yibuxiaoxin",
    age: "19",
  };
  // 将数据转化为字符串
  let str = JSON.stringify(data);
  // 接收 callback 参数
  let cb = req.query.callback;
  // 查询字符串callback的值为回调函数名
  // 将数据作为回调函数的参数传递给前端
  // 返回结果
  res.end(`${cb}(${str})`);
});

app.all("/cors", (req, res) => {
  // 允许指定的协议域名端口访问
  res.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:5500");
  res.send("cros");
});

// 4.监听端口并启动服务
app.listen(8000, () => {
  console.log("服务运行在 8000 端口");
});
